今天我們來玩玩4x4鍵盤,這種鍵盤是薄膜開關的4×4矩陣鍵盤,如下圖
矩陣鍵盤和一般按鍵不一樣的地方,就是不管今天你有幾個按鍵,鍵盤中的鍵分為行和列,我們將使用它來找出按下了哪個按鍵
如上圖,鍵盤有16個鍵,它們分為4個行和4個列。每行(ROW)中的所有按鍵連接在一起,而每列(COL)中的所有按鍵連接在一起,如下圖所示
每當我按下按鍵時,行(ROW)與列(COL)之間就會連接,並且列(COL)引腳電位為0
這將告訴我們ROW和COL均為0(LOW),我們就知道按下了甚麼按鍵
假設我按了“9”。要確定這一點,我需要將第三個行(ROW)拉到LOW,然後檢查Columns。每當按下“9”時,第三列將變為0(LOW),所以第三行(ROW)和第三個列(COL)之間就會連接。我們就知道9被按下了
我在這裡使用的方法是輪詢,顯然中斷的方式更好,但我們先確認基本功能完備再來執行中斷
/ *偵測第一行,將R1拉低,其餘拉高* /
HAL_GPIO_WritePin ( GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); // 將 R1 拉低
HAL_GPIO_WritePin ( GPIOA, GPIO_PIN_2, GPIO_PIN_SET); // 將 R2 拉高
HAL_GPIO_WritePin ( GPIOA, GPIO_PIN_3, GPIO_PIN_SET); // 將 R3 拉高
HAL_GPIO_WritePin ( GPIOA, GPIO_PIN_4, GPIO_PIN_SET); // 將 R4 拉高
if (!(HAL_GPIO_ReadPin ( GPIOB, GPIO_PIN_1))) // 如果第一列為0
{
while (!(HAL_GPIO_ReadPin ( GPIOB, GPIO_PIN_1))); // 如果1被按下回傳1
return '1';
}
if (!(HAL_GPIO_ReadPin ( GPIOB, GPIO_PIN_2))) // 如果第二列為0
{
while (!(HAL_GPIO_ReadPin ( GPIOB, GPIO_PIN_2))); // 如果2被按下回傳2
return '2';
}
if (!(HAL_GPIO_ReadPin ( GPIOB, GPIO_PIN_3))) // 如果第三列為0
{
while (!(HAL_GPIO_ReadPin ( GPIOB, GPIO_PIN_3))); // 如果3被按下回傳3
return '3';
}
if (!(HAL_GPIO_ReadPin ( GPIOB, GPIO_PIN_4))) // 如果第四列為0
{
while (!(HAL_GPIO_ReadPin ( GPIOB, GPIO_PIN_4))); // 如果4被按下回傳4
return 'A';
}
- STM32 Nucleo-64 boards (MB1136)資料手冊
https://www.st.com/resource/en/user_manual/dm00105823-stm32-nucleo-64-boards-mb1136-stmicroelectronics.pdf- STM32L053R8 datasheet
https://www.st.com/resource/en/datasheet/stm32l053r8.pdf- RM0367 Reference manual Ultra-low-power STM32L0x3 advanced Arm®-based 32-bit MCUs
https://www.st.com/resource/en/reference_manual/dm00095744-ultra-low-power-stm32l0x3-advanced-arm-based-32-bit-mcus-stmicroelectronics.pdf- ARM Mbed官網介紹 - NUCLEO-L053R8
https://os.mbed.com/platforms/ST-Nucleo-L053R8/- STM32 官網介紹 - STM32L053R8
https://www.st.com/en/microcontrollers-microprocessors/stm32l053r8.html#overview
- 此開發板售價在臺幣1000元以下,讀者可於以下網站購得:
https://www.mouser.tw/
https://www.digikey.tw/
到底~